// 链表判环最简单的就是快慢指针了，无环的肯定能走到指空的节点next
//  如果有环最后肯定就在环里打转， 快慢指针在遍历链表时一个正常走，另一个每次迭代走两步这样，有环自会相遇

function hasCycle(head){
    if(!head || head.next) return false
    let s = head, q = head.next.next ;
    while(s !=q && q &&q.next){
        s = s.next
        q = q.next.next
    }
    return s ===q 
}

/*假设a 为起点到入环点的距离，当慢指针在环里走到入环点时，快指针在环内走了b距离 那么 2a = a + b  . a =b，假设此时需要q步相遇 q + b = nr
当他们相遇时 慢指针就在距离入环点q的位置，q有可能大于环的周长，不过不影响， 快指针自然也是在这  ，先假设q + b = r ， 那么此时相遇点再往前走b 也就回到了入环点
 */

var detectCycle = function(head) {
    if(head === null || head.next === null) return null
    let s = head.next,
    q =head.next.next
    while(q !== null){
        s= head.next
        q= q.next.next
        if(q === s){
            s = head
            while(q !== s){
                q= q.next
                s =s.next
                }
                return q
        }
    }
    return null

};